﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Web;
using ISHotel.Database;
using Oracle.DataAccess.Client;

namespace ISHotel.Database
{
    [Serializable]
    public class ObjednavkaSluzbyTable : DbTable
    {
        public static String TABLE_NAME = "Objednavka_sluzby";

        public String SQL_SELECT = "SELECT * FROM Objednavka_sluzby";
        public String SQL_SELECT_id_sluzby = "SELECT o.*, s.nazev_sluzby, s.cena_sluzby FROM Objednavka_sluzby o, Sluzba s WHERE o.id_sluzby=:id_sluzby AND o.id_pobytu=:id_pobytu AND o.id_sluzby=s.id_sluzby";
        public String SQL_SELECT_id_pobytu = "SELECT o.*, s.nazev_sluzby, s.cena_sluzby FROM Objednavka_sluzby o, Sluzba s WHERE o.id_pobytu=:id_pobytu AND o.id_sluzby=s.id_sluzby";
        public String SQL_INSERT = "INSERT INTO Objednavka_sluzby (id_sluzby, id_pobytu, mnozstvi_sluzeb) VALUES (:id_sluzby, :id_pobytu, :mnozstvi_sluzeb)";
        public String SQL_UPDATE = "UPDATE Objednavka_sluzby SET mnozstvi_sluzeb=:mnozstvi_sluzeb WHERE id_sluzby=:id_sluzby AND id_pobytu=:id_pobytu";
        public String SQL_DELETE = "DELETE FROM Objednavka_sluzby WHERE id_sluzby=:id_sluzby AND id_pobytu=:id_pobytu";

        public ObjednavkaSluzbyTable()
            : base(TABLE_NAME)
        {
        }

        /**
 * Insert the record.
 **/
        public int Insert(ObjednavkaSluzby Objednavka_sluzby)
        {
            int ret;
            
            mDatabase.Connect();
            OracleCommand command = mDatabase.CreateCommand(SQL_INSERT);
            PrepareCommand(command, Objednavka_sluzby);
            try
            {
                ret = mDatabase.Insert(command);
            }
            catch (Exception e)
            {

                throw e;
            }
            mDatabase.Close();
            
            
            

            PobytTable pobytTable = new PobytTable();
            pobytTable.Prepocitat(Objednavka_sluzby.id_pobytu); 

            return ret;
        }

        /**
         * Update the record.
         **/
        public int Update(ObjednavkaSluzby Objednavka_sluzby)
        {
            mDatabase.Connect();
            OracleCommand command = mDatabase.CreateCommand(SQL_UPDATE);

            command.Parameters.Add(new OracleParameter(":" + ObjednavkaSluzby.ATTR_mnozstvi_sluzeb, OracleDbType.Decimal));
            command.Parameters[":" + ObjednavkaSluzby.ATTR_mnozstvi_sluzeb].Value = Objednavka_sluzby.mnozstvi_sluzeb;

            command.Parameters.Add(new OracleParameter(":" + ObjednavkaSluzby.ATTR_id_sluzby, OracleDbType.Decimal));
            command.Parameters[":" + ObjednavkaSluzby.ATTR_id_sluzby].Value = Objednavka_sluzby.id_sluzby;

            command.Parameters.Add(new OracleParameter(":" + ObjednavkaSluzby.ATTR_id_pobytu, OracleDbType.Decimal));
            command.Parameters[":" + ObjednavkaSluzby.ATTR_id_pobytu].Value = Objednavka_sluzby.id_pobytu;

            int ret = mDatabase.Update(command);
            mDatabase.Close();

            PobytTable pobytTable = new PobytTable();
            pobytTable.Prepocitat(Objednavka_sluzby.id_pobytu);

            return ret;
        }

        /**
         * Prepare a command.
         **/

        private void PrepareCommand(OracleCommand command, ObjednavkaSluzby Objednavka_sluzby)
        {
            command.Parameters.Add(new OracleParameter(":" + ObjednavkaSluzby.ATTR_id_sluzby, OracleDbType.Decimal));
            command.Parameters[":" + ObjednavkaSluzby.ATTR_id_sluzby].Value = Objednavka_sluzby.id_sluzby;

            command.Parameters.Add(new OracleParameter(":" + ObjednavkaSluzby.ATTR_id_pobytu, OracleDbType.Decimal));
            command.Parameters[":" + ObjednavkaSluzby.ATTR_id_pobytu].Value = Objednavka_sluzby.id_pobytu;

            command.Parameters.Add(new OracleParameter(":" + ObjednavkaSluzby.ATTR_mnozstvi_sluzeb, OracleDbType.Decimal));
            command.Parameters[":" + ObjednavkaSluzby.ATTR_mnozstvi_sluzeb].Value = Objednavka_sluzby.mnozstvi_sluzeb;
        }

        /**
         * Select records.
         **/
        public Collection<ObjednavkaSluzby> Select()
        {
            mDatabase.Connect();
            OracleCommand command = mDatabase.CreateCommand(SQL_SELECT);
            OracleDataReader reader = mDatabase.Select(command);

            Collection<ObjednavkaSluzby> Objednavka_sluzbys = Read(reader);
            reader.Close();
            mDatabase.Close();
            return Objednavka_sluzbys;
        }

        public Collection<ObjednavkaSluzby> Select(int id_pobytu)
        {
            mDatabase.Connect();
            OracleCommand command = mDatabase.CreateCommand(SQL_SELECT_id_pobytu);

            command.Parameters.Add(new OracleParameter(":" + ObjednavkaSluzby.ATTR_id_pobytu, OracleDbType.Decimal));
            command.Parameters[":" + ObjednavkaSluzby.ATTR_id_pobytu].Value = id_pobytu;

            OracleDataReader reader = mDatabase.Select(command);

            Collection<ObjednavkaSluzby> Objednavka_sluzbys = Read2(reader);
            reader.Close();
            mDatabase.Close();
            return Objednavka_sluzbys;
        }

        /**
         * Select the record.
         **/
        public ObjednavkaSluzby Select(int id_sluzby, int id_pobytu)
        {
            mDatabase.Connect();
            OracleCommand command = mDatabase.CreateCommand(SQL_SELECT_id_sluzby);

            command.Parameters.Add(new OracleParameter(":" + ObjednavkaSluzby.ATTR_id_sluzby, OracleDbType.Decimal));
            command.Parameters[":" + ObjednavkaSluzby.ATTR_id_sluzby].Value = id_sluzby;
            command.Parameters.Add(new OracleParameter(":" + ObjednavkaSluzby.ATTR_id_pobytu, OracleDbType.Decimal));
            command.Parameters[":" + ObjednavkaSluzby.ATTR_id_pobytu].Value = id_pobytu;

            OracleDataReader reader = mDatabase.Select(command);

            Collection<ObjednavkaSluzby> Objednavka_sluzbys = Read2(reader);
            ObjednavkaSluzby Objednavka_sluzby1 = null;
            if (Objednavka_sluzbys.Count == 1)
            {
                Objednavka_sluzby1 = Objednavka_sluzbys[0];
            }
            reader.Close();
            mDatabase.Close();
            return Objednavka_sluzby1;
        }

        private Collection<ObjednavkaSluzby> Read(OracleDataReader reader)
        {
            Collection<ObjednavkaSluzby> Objednavka_sluzbys = new Collection<ObjednavkaSluzby>();

            while (reader.Read())
            {
                ObjednavkaSluzby Objednavka_sluzby = new ObjednavkaSluzby();
                Objednavka_sluzby.id_pobytu = (int)reader.GetDecimal(0);
                Objednavka_sluzby.id_sluzby = (int)reader.GetDecimal(1);
                Objednavka_sluzby.mnozstvi_sluzeb = (int)reader.GetDecimal(2);
                Objednavka_sluzbys.Add(Objednavka_sluzby);
            }
            return Objednavka_sluzbys;
        }


        private Collection<ObjednavkaSluzby> Read2(OracleDataReader reader)
        {
            Collection<ObjednavkaSluzby> Objednavka_sluzbys = new Collection<ObjednavkaSluzby>();

            while (reader.Read())
            {
                ObjednavkaSluzby Objednavka_sluzby = new ObjednavkaSluzby();
                Objednavka_sluzby.id_pobytu = (int)reader.GetDecimal(0);
                Objednavka_sluzby.id_sluzby = (int)reader.GetDecimal(1);
                Objednavka_sluzby.mnozstvi_sluzeb = (int)reader.GetDecimal(2);
                Objednavka_sluzby.nazev_sluzby = reader.GetString(3);
                Objednavka_sluzby.cena_sluzby = (int) reader.GetDecimal(4);
                Objednavka_sluzbys.Add(Objednavka_sluzby);
            }
            return Objednavka_sluzbys;
        }
        /**
         * Delete the record.
         */
        public int Delete(int id_sluzby, int id_pobytu)
        {
            mDatabase.Connect();
            OracleCommand command = mDatabase.CreateCommand(SQL_DELETE);

            command.Parameters.Add(new OracleParameter(":" + ObjednavkaSluzby.ATTR_id_sluzby, OracleDbType.Decimal));
            command.Parameters[":" + ObjednavkaSluzby.ATTR_id_sluzby].Value = id_sluzby;
            command.Parameters.Add(new OracleParameter(":" + ObjednavkaSluzby.ATTR_id_pobytu, OracleDbType.Decimal));
            command.Parameters[":" + ObjednavkaSluzby.ATTR_id_pobytu].Value = id_pobytu;

            int ret;
            try
            {
                ret = mDatabase.Delete(command);
            }
            catch (Exception e)
            {
                throw e;
            }
            
            mDatabase.Close();

            PobytTable pobytTable =new PobytTable();
            pobytTable.Prepocitat(id_pobytu);

            return ret;
        }
    }
}